<?php
/**
 * Redis 操作，支持 Master/Slave 的负载集群
 */

namespace Apps\lib;

/**
 *  Redis锁操作类
 *
 *  Func:
 *  public  lock    获取锁
 *  public  unlock  释放锁
 *  private connect 连接
 */
class Redis
{

    private $_config;
    private $_redis;

    /**
     * 初始化
     * @param array $config redis连接设定
     */
    public function __construct($config = array())
    {
        $this->_config = $config;
        $this->_redis = $this->connect();
    }

    public function getRedis()
    {
        return $this->_redis;
    }

    /**
     * 获取锁
     * @param  String $key 锁标识
     * @param  Int $expire 锁过期时间
     * @return Boolean
     */
    public function lock($key, $expire = 5)
    {
        $is_lock = $this->_redis->setnx($key, time() + $expire);

        // 不能获取锁
        if (!$is_lock) {

            // 判断锁是否过期
            $lock_time = $this->_redis->get($key);

            // 锁已过期，删除锁，重新获取
            if (time() > $lock_time) {
                $this->unlock($key);
                $is_lock = $this->_redis->setnx($key, time() + $expire);
            }
        }

        return $is_lock ? true : false;
    }

    /**
     * 释放锁
     * @param  String $key 锁标识
     * @return Boolean
     */
    public function unlock($key)
    {
        return $this->_redis->del($key);
    }

    /**
     * 创建 redis 连接
     * @return \Redis
     */
    private function connect()
    {
        try {
            $redis = new \Redis();
            $redis->connect($this->_config['host'], $this->_config['port'], $this->_config['timeout'], $this->_config['reserved'], $this->_config['retry_interval']);
            if (empty($this->_config['auth'])) {
                $redis->auth($this->_config['auth']);
            }
            $redis->select($this->_config['index']);
        } catch (\RedisException $e) {
            //throw new \Exception($e->getMessage());
            exit($e->getMessage());
        }
        return $redis;
    }

}
